方法可见性
在 Ruby 中,方法的可见性(visibility)决定了哪些代码可以调用这些方法。理解方法可见性对于编写模块化、可维护的代码至关重要。Ruby 提供了三种方法可见性:public、private 和 protected。
1. 公共方法 (public)
公共方法是默认的可见性,可以在任何地方调用。它们通常用于类的外部接口,供其他对象或类使用。
代码示例
class MyClass
def public_method
puts "This is a public method"
end
end
obj = MyClass.new
obj.public_method # 输出: This is a public method
解释
public_method是一个公共方法,可以在类的外部调用。- 任何对象都可以调用这个方法。
2. 私有方法 (private)
私有方法只能在类的内部调用,不能在类的外部或通过对象实例调用。私有方法通常用于类的内部实现细节,不希望被外部访问。
代码示例
class MyClass
def public_method
puts "This is a public method"
private_method # 在内部调用私有方法
end
private
def private_method
puts "This is a private method"
end
end
obj = MyClass.new
obj.public_method # 输出: This is a public method
# 输出: This is a private method
# obj.private_method # 这行代码会导致错误,因为私有方法不能在类的外部调用
解释
private_method是一个私有方法,只能在类的内部调用。- 在
public_method内部调用private_method是合法的。 - 尝试在类的外部调用
private_method会导致错误。
3. 受保护方法 (protected)
受保护方法可以在类的内部以及子类中调用,但不能在类的外部调用。受保护方法通常用于类的内部实现细节,但允许子类访问。
代码示例
class MyClass
def public_method
puts "This is a public method"
protected_method # 在内部调用受保护方法
end
protected
def protected_method
puts "This is a protected method"
end
end
class SubClass < MyClass
def call_protected
protected_method # 在子类中调用受保护方法
end
end
obj = MyClass.new
obj.public_method # 输出: This is a public method
# 输出: This is a protected method
sub_obj = SubClass.new
sub_obj.call_protected # 输出: This is a protected method
# obj.protected_method # 这行代码会导致错误,因为受保护方法不能在类的外部调用
解释
protected_method是一个受保护方法,可以在类的内部和子类中调用。- 在
public_method内部调用protected_method是合法的。 - 在子类
SubClass中调用protected_method也是合法的。 - 尝试在类的外部调用
protected_method会导致错误。
4. 实践练习
练习 1: 定义一个类并设置方法可见性
- 创建一个名为
Person的类。 - 定义一个公共方法
greet,它输出 "Hello!"。 - 定义一个私有方法
secret,它输出 "This is a secret!"。 - 在
greet方法中调用secret方法。 - 创建一个
Person类的实例并调用greet方法。
练习 2: 使用受保护方法
- 创建一个名为
Employee的类,继承自Person类。 - 在
Employee类中定义一个受保护方法salary,它输出 "Salary is confidential!"。 - 在
Employee类中定义一个公共方法display_salary,它调用salary方法。 - 创建一个
Employee类的实例并调用display_salary方法。
练习 3: 尝试调用私有和受保护方法
- 尝试在
Person类的外部调用secret方法。 - 尝试在
Employee类的外部调用salary方法。 - 观察并记录错误信息。
5. 总结
方法可见性是 Ruby 中控制方法访问权限的重要机制。通过合理使用 public、private 和 protected,可以提高代码的封装性和可维护性。公共方法用于类的外部接口,私有方法用于内部实现细节,受保护方法用于允许子类访问的内部实现细节。
通过实践练习,你将更好地理解如何在实际项目中应用这些概念。